题面传送门:P16953 「NLOI Round1」白鸟过河滩
题目大意
每组数据给定三组演唱效果与人数,求其商的最大值所在下标。
思路讲解
首先肯定是要求对应值的商。
此处求商不能直接除,我们可以观察部分样例来得到原因。
5 6 9 3 4 5 这组样例若使用普通除法,即整除,所得结果应该是 ,而答案给出的是 ,这说明本题中算商需要浮点数的参与,因此需要改变数据存储方式。
接下来是对商进行打擂台找最值,并记录结果下标。此处不再赘述。
代码实现
先说一下存储
#include<bits/stdc++.h>using namespace std;int t,maxp;long double maxx,a[4],b[4];int main(){ ... for(int z=1;z<=t;z++){ ... cin>>a[1]>>a[2]>>a[3]>>b[1]>>b[2]>>b[3]; ... } return 0;}此处 数组存演唱效果, 数组存人数。由于要算的商是一一对应的,所以使用数组也可以快速找到答案下标。
WARNING
数据点 达到 ,再求商后小数点后位数增长迅猛,double 类型极易溢出,应使用 long double。为防止运算精度问题,上方两数组也应顺便开成 long double。
完整代码
#include<bits/stdc++.h>using namespace std;int t,maxp;long double maxx,a[4],b[4];int main(){ cin>>t; for(int z=1;z<=t;z++){ maxx=0;maxp=1;//多测不清空,_____ //小声BB:有可能三个商相等,根据编号最小的规则,应将变量 maxp 初始化为 1。 cin>>a[1]>>a[2]>>a[3]>>b[1]>>b[2]>>b[3]; for(int i=1;i<=3;i++){ if(a[i]/b[i]>maxx){ maxx=a[i]/b[i]; maxp=i; } } cout<<maxp<<'\n'; } return 0;}













